package project.suntray.com.core.net;

import java.util.WeakHashMap;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.QueryMap;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * Created by zhangyang on 2017/12/14 03:36.
 * version 1
 * <p>
 * 定义 Retrofit 中的网络框架 业务!
 */
public interface RestService {

    /**
     * 定义get方法
     * @param url
     * @param queryMap
     * @return
     */
    @GET
    Call<String> get(@Url String url, @QueryMap WeakHashMap<String, Object> queryMap);

    /**
     * 设置 put方法  注意需要加上formUrlEncoded表单编码
     * @param url
     * @param fieldMap
     * @return
     */
    @FormUrlEncoded
    @POST
    Call<String> post(@Url String url, @FieldMap WeakHashMap<String, Object> fieldMap);


    /**
     * 以body形式 放入数据
     * @param url
     * @param requestBody
     * @return
     */
    @POST
    Call<String> postRaw(@Url String url, @Body RequestBody requestBody);


    /**
     * 以 put形式 请求表单数据
     * @param url
     * @param fieldMap
     * @return
     */
    @FormUrlEncoded
    @PUT
    Call<String> put(@Url String url, @FieldMap WeakHashMap<String, Object> fieldMap);

    /**
     * 原始方法加入
     * @param url
     * @param body
     * @return
     */
    @PUT
    Call<String> putRaw(@Url String url, @Body RequestBody body);


    /**
     * 删除数据请求
     * @param url
     * @param fieldMap
     * @return
     */
    @FormUrlEncoded
    @DELETE
    Call<String> delete(@Url String url, @FieldMap WeakHashMap<String, Object> fieldMap);

    /**
     * 删除数据请求  toDO 测试一下这个形式有没有
     * @param url
     * @param requestBody
     * @return
     */
    @DELETE
    Call<String> deleteRaw(@Url String url, @Body RequestBody requestBody);


    /**
     * 下载数据
     * @param url
     * @param queryMaps
     * @return
     */
    @Streaming
    @GET
    Call<ResponseBody> downLoad(@Url String url, @QueryMap WeakHashMap<String, Object> queryMaps);


    /**
     * 单文件上传
     * @param url
     * @param part
     * @return
     */
    @Multipart
    @POST
    Call<String> upload(@Url String url, @Part MultipartBody.Part part);

    /**
     * 多文件上传
     * @param url
     * @param part
     * @return
     */
    @POST
    Call<String> uploadMultiFile(@Url String url, @Body MultipartBody part);
}
